package com.单例模式;

/**
 * 静态变量饿汉式
 */
public class StaticFieldSingleton {

    public static void main(String[] args) {
        InnerSingleton ins1 = InnerSingleton.getInstance();
        InnerSingleton ins2 = InnerSingleton.getInstance();
        System.out.println(ins1==ins2);//true
    }
}

class Singleton{

    /**
     * volatile：保证线程之间的可见性---hapens-before
     */
    private volatile static Singleton instance;
    /**
     * 1：构造器私有化
     */
    private Singleton(){

    }

    /**
     * 3：向外暴露一个静态的公共方法
     * 懒汉式的加锁是有讲究的synchronized加在方法上，这样能保证线程安全，但是每次调用getInstance()方法，都会被加锁，大大降低运行效率
     * 所有就有了双重校验方式
     */
    public static  Singleton getInstance(){
        /**
         * 双重校验
         */
        if (instance==null){
            synchronized (Singleton.class){
                if (instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}
